package main

import (
	"fmt"
	"io"
	"net"
	"strings"
)

type User struct {
	Name string
	AddrName string
	Conn net.Conn

	C chan string
	Live chan bool
	Ser *Server
}

func NewUser(conn net.Conn, server *Server) *User {
	user := &User{
		Name: conn.RemoteAddr().String(),
		AddrName: conn.RemoteAddr().String(),
		Conn: conn,
		C: make(chan string),
		Live: make(chan bool),
		Ser: server,
	}



	return user
}

// user操作
func (u *User) Handler()  {

	for  {
		byteMsg := make([]byte,1024)
		intNum,err := u.Conn.Read(byteMsg)

		if intNum == 0 {
			u.Offline()
			return
		}

		if err != nil && err != io.EOF{
			fmt.Printf("Read client[%s] read-int: [%d] error is %s \n", u.Name, intNum, err)
			return
		}

		// 对接收到的信息进行处理，去除EOF
		msg := string(byteMsg[:intNum-1])

		u.Live <- true
		fmt.Printf(fmt.Sprintf("接收到信息: [%s] \n", msg))

		if msg == "who" {

			// 查看自己是谁
			u.SendMsg(fmt.Sprintf("当前用户是:[%s]", u.Name))

		} else if msg == "list" {
			// 当前用户列表
			for userName,_ := range u.Ser.OnlineMap {
				u.SendMsg(fmt.Sprintf("用户名：%s 在线", userName))
			}

		} else if len(msg) > 7 && msg[:7] == "rename|" {

			// 更改昵称, 不能重复
			newName := msg[7:]
			MapUser,ok := u.Ser.OnlineMap[newName]

			if ok {
				u.SendMsg(fmt.Sprintf("当前昵称已存在:[%s]", MapUser.Name))
			}else{

				u.Ser.syncMap.Lock()
				delete(u.Ser.OnlineMap, u.Name)
				u.Name = newName
				u.Ser.OnlineMap[newName] = u
				u.Ser.syncMap.Unlock()

				u.SendMsg(fmt.Sprintf("更名成功"))
			}
		} else if len(msg) > 4 && msg[:3] == "to|" {
			// 私聊
			msgList := strings.Split(msg,"|")
			if len(msgList) < 3 {
				u.SendMsg(fmt.Sprintf("您的私聊格式不正确, 请输入'to|张三|你好啊！'"))
			}else{
				MapUser,ok := u.Ser.OnlineMap[msgList[1]]
				if ok {
					MapUser.SendMsg(fmt.Sprintf("用户[%s] 对您谁：%s", u.Name, msgList[2]))
				}else{
					u.SendMsg(fmt.Sprintf("查找用户[%s] 失败", msgList[1]))
				}
			}
		}else{
			u.SendMsg(fmt.Sprintf("指令[%s] 无效", msg))
		}
	}
}

// 上线
func (u *User) Online()  {
	u.Ser.BroadCast("上线了！", u)
}

// 下线
func (u *User) Offline()  {
	u.Ser.clearUserInfoByName(u)
	u.Ser.BroadCast("下线了！", u)
}

// 给某个人发消息
func (u *User) SendMsg(msg string){
	u.Conn.Write([]byte(msg + "\n"))
}

// user监听信息
func (u *User) listenMsg()  {
	for {
		msg := <- u.C
		u.Conn.Write([]byte(msg + "\n"))
	}
}